﻿#ifndef TESTTEMPLATE_H
#define TESTTEMPLATE_H

#include <QStandardItemModel>
#include <QStringListModel>
#include <QWidget>
#include "common/datatypes.h"

namespace Ui {
class TestTemplateWidget;
}
class SubBandTableModel;
class TestTemplateWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief TestTemplateWidget::TestTemplateWidget
     * @details 构造测试模板管理界面。
     * @param parent Qt 父窗口。
     */
    explicit TestTemplateWidget(QWidget *parent = nullptr);
    /**
     * @brief TestTemplateWidget::~TestTemplateWidget
     * @details 释放界面资源。
     */
    ~TestTemplateWidget();

private slots:
    /**
     * @brief TestTemplateWidget::on_btn_add_subTemplate_clicked
     * @details 新增子区间的按钮回调。
     */
    void on_btn_add_subTemplate_clicked();
    /**
     * @brief TestTemplateWidget::on_btn_del_subTemplate_clicked
     * @details 删除选中子区间的按钮回调。
     */
    void on_btn_del_subTemplate_clicked();
    /**
     * @brief TestTemplateWidget::on_btn_add_testTemplate_clicked
     * @details 新增测试模板的按钮回调。
     */
    void on_btn_add_testTemplate_clicked();
    /**
     * @brief TestTemplateWidget::on_btn_del_testTemplate_clicked
     * @details 删除当前测试模板的按钮回调。
     */
    void on_btn_del_testTemplate_clicked();
    /**
     * @brief TestTemplateWidget::on_btn_save_Template_clicked
     * @details 保存当前测试模板的按钮回调。
     */
    void on_btn_save_Template_clicked();

    /**
     * @brief TestTemplateWidget::slot_templateNameChanged
     * @details 模板名称编辑后更新模型。
     * @param topLeft 修改区域左上角索引。
     * @param bottomRight 修改区域右下角索引。
     */
    void slot_templateNameChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
    /**
     * @brief TestTemplateWidget::on_cBox_levelunit_currentTextChanged
     * @details 场强单位切换时同步界面显示。
     * @param arg1 当前单位文本。
     */
    void on_cBox_levelunit_currentTextChanged(const QString &arg1);

    /**
     * @brief TestTemplateWidget::onListCurrentChanged
     * @details 模板列表选中项变化回调。
     * @param current 当前索引。
     * @param previous 之前索引。
     */
    void onListCurrentChanged(const QModelIndex &current, const QModelIndex &previous);
    /**
     * @brief TestTemplateWidget::onTableCurrentChanged
     * @details 子区间表格选中行变化回调。
     * @param current 当前索引。
     * @param previous 之前索引。
     */
    void onTableCurrentChanged(const QModelIndex &current, const QModelIndex &previous);

    /**
     * @brief TestTemplateWidget::onEditorChanged
     * @details 任一编辑控件更改时统一处理。
     */
    void onEditorChanged();
    /**
     * @brief TestTemplateWidget::slot_hardwareTemplatesChanged
     * @details 硬件模板数据发生变化时的回调。
     */
    void slot_hardwareTemplatesChanged();
    /**
     * @brief TestTemplateWidget::slot_parameterTablesChanged
     * @details 参数表数据发生变化时的回调。
     */
    void slot_parameterTablesChanged();

    /**
     * @brief TestTemplateWidget::on_tBtn_synchronize_clicked
     * @details 同步场强值按钮回调。
     */
    void on_tBtn_synchronize_clicked();
    /**
     * @brief TestTemplateWidget::on_cBox_measurementCategory_currentIndexChanged
     * @details 测量类别切换后的处理。
     * @param index 当前索引。
     */
    void on_cBox_measurementCategory_currentIndexChanged(int index);
    /**
     * @brief TestTemplateWidget::on_cBox_levelmode_currentIndexChanged
     * @details 功率调平模式切换后的处理。
     * @param index 当前索引。
     */
    void on_cBox_levelmode_currentIndexChanged(int index);

private:
    /**
     * @brief TestTemplateWidget::initTableView
     * @details 初始化子区间表格视图与模型。
     */
    void initTableView();
    /**
     * @brief TestTemplateWidget::initListView
     * @details 初始化测试模板列表视图。
     */
    void initListView();
    /**
     * @brief TestTemplateWidget::initEditors
     * @details 初始化编辑控件并绑定信号。
     */
    void initEditors();
    /**
     * @brief TestTemplateWidget::loadRowToEditors
     * @details 将表格行数据加载到编辑控件。
     * @param row 当前行索引。
     */
    void loadRowToEditors(int row);
    /**
     * @brief TestTemplateWidget::applyEditorsToRow
     * @details 将编辑控件数据写回子区间对象。
     * @param row 当前行索引。
     */
    void applyEditorsToRow(int row);
    /**
     * @brief TestTemplateWidget::setEditorsEnabled
     * @details 控制编辑区域的启用状态。
     * @param en true 启用，false 禁用。
     */
    void setEditorsEnabled(bool en);
    /**
     * @brief TestTemplateWidget::refreshHwTemplateCommbox
     * @details 根据测试类型刷新硬件模板列表。
     * @param type 硬件模板类型。
     */
    void refreshHwTemplateCommbox(const HardwareTemplateType type);

private:
    Ui::TestTemplateWidget *ui;
    QStringListModel *m_modelTemplateList = nullptr;
    SubBandTableModel *m_subModel = nullptr;
    QVector<OverviewItem> m_overviews; // 行号 -> OverviewItem 映射
    TestTemplatePtr m_currentTpl;
    // 编辑区加载/回写时的信号屏蔽
    bool m_blockEditorSignals = false;
};

#endif // TESTTEMPLATE_H
